<html>
    <head>
        <title>模块类</title>
    </head>
    <body>
        <script>
            /*
                        二、模块类  Module Class

                                每个模块都应该定义一个模块类。

                                定义模块类的最简单方法是创建一个从AbpModule派生的类，如下所示：

                                        public class BlogModule : AbpModule
                                        {
                                                    
                                        }

                                1、配置依赖注入和其他模块  Configuring Dependency Injection & Ohter Modules

                                        ①、ConfigureServices 服务配置方法：

                                                ConfigureServices是将你的服务添加到依赖注入系统并配置其他模块的主要方法。
                                                
                                                (这些方法也有异步版本，如果要在这些方法中进行异步调用，请覆盖异步版本而不是同步版本。)

                                                例子：

                                                    public class BlogModule : AbpModule
                                                    {
                                                        // 重写ConfigureServices方法，添加服务到依赖注入系统。
                                                        public override void ConfigureServices(ServiceConfigurationContext context)
                                                        {
                                                            //...
                                                        }
                                                    }

                                                 你可以按照 Microsoft 的文档那样逐个添加服务依赖注册。但是ABP有一个"基于约定的依赖注入系统"，它会自动注册程序集中的所有服务。

                                                 有关依赖注入系统的更多信息，请参阅ABP基本面--依赖注入： https://abp.io/docs/latest/framework/fundamentals/dependency-injection

                                                 你还可以通过这种方式配置其他服务和模块：

                                                 eg：

                                                        public class BlogModule : AbpModule
                                                        {
                                                            public override void ConfigureServices(ServiceConfigurationContext context)
                                                            {
                                                                // 配置数据库连接字符串
                                                                Configure<AbpDbConnectionOptions>(options =>
                                                                {
                                                                    options.ConnectionStrings.Default = "......";
                                                                });
                                                            }
                                                        }

                                                (ConfigureServices方法也有一个异步版本：ConfigureServicesAsync。如果你想在此方法中进行异步调用（使用await关键字），请覆盖异步版本而不是同步版本。如果你同时覆盖异步和同步版本，则只会执行异步版本。)


                                2、Pre & Post Configure Services  前置/后置服务配置
                                
                                                
                                                AbpModule类还定义了PreConfigureServices和PostConfigureServices方法来覆盖和编写你的代码，就在ConfigureServices之前和之后。

                                                请注意，你写入这些方法的代码将在"所有其他模块"的ConfigureServices方法之前/之后执行。
                                                
                                                （这些方法也有异步版本。如果要在这些方法中进行异步调用，请覆盖异步版本而不是同步版本。）


                                3、Application Initialization  应用初始化

                                                    配置完所有模块的所有服务后，应用程序将从初始化所有模块开始。

                                                    在此阶段，你可以解析来自IServiceProvider的服务，因为它已经准备好并且可用。

                                                ①、OnApplicationInitialization方法

                                                        你可以重写OnApplicationInitialization方法以在应用程序启动时执行代码。

                                                        eg:

                                                            public class BlogModule : AbpModule
                                                            {
                                                                public override void OnApplicationInitialization(
                                                                    ApplicationInitializationContext context)
                                                                {
                                                                    var myService = context.ServiceProvider.GetService<MyService>();
                                                                    myService.DoSomething();
                                                                }
                                                            } 
                                                                
                                                        OnApplicationInitialization方法也有一个异步版本。
                                                        
                                                        如果要在此方法中进行异步调用（使用await关键字），请覆盖异步版本而不是同步版本。

                                                        eg:

                                                            public class BlogModule : AbpModule
                                                            {
                                                                public override Task OnApplicationInitializationAsync(
                                                                    ApplicationInitializationContext context)
                                                                {
                                                                    var myService = context.ServiceProvider.GetService<MyService>();
                                                                    await myService.DoSomethingAsync();
                                                                }
                                                            }

                                                        如果你同时覆盖异步和同步版本，则只会执行异步版本。


                                                    ★、OnApplicationInitialization一般由启动模块用来构建ASP.NET核心应用程序的中间件管道。

                                                        eg:
                                                            [DependsOn(typeof(AbpAspNetCoreMvcModule))]  
                                                            public class AppModule : AbpModule
                                                            {
                                                                // 应用初始化钩子，一般用于配置请求管道
                                                                public override void OnApplicationInitialization(ApplicationInitializationContext context)
                                                                {
                                                                    var app = context.GetApplicationBuilder();
                                                                    var env = context.GetEnvironment();

                                                                    if (env.IsDevelopment())
                                                                    {
                                                                        app.UseDeveloperExceptionPage();  
                                                                    }

                                                                    app.UseMvcWithDefaultRoute();
                                                                }
                                                            }

                                                        如果你的模块需要，你还可以执行启动逻辑

                                                ②、Pre & Post Application Initialization 初始化前 和 初始化后  钩子函数

                                                        AbpModule类还定义了OnPreApplicationInitialization和OnPostApplicationInitialization方法来覆盖和写入你的代码，

                                                        就在OnApplicationInitialization之前和之后。

                                                        请注意，你写入这些方法的代码将在所有其他模块的OnApplicationInitialization方法之前/之后执行。

                                                        （这些方法也有异步版本，如果要在这些方法中进行异步调用，请覆盖异步版本而不是同步版本。）

                                
                                4、应用程序关闭  Application Shutdown

                                            最后，如果你想在应用程序关闭时执行一些代码，你可以覆盖OnApplicationShutdown方法。

                                            此方法也有异步版本。如果要在此方法中进行异步调用，请覆盖异步版本而不是同步版本。
                                             
                    */
        </script>
    </body>
</html>